package cn.itcast.nems.common.service.impl;

import cn.itcast.nems.common.enumeration.BizNumberTypeEnum;
import com.google.common.hash.Hashing;
import org.apache.commons.lang3.RandomStringUtils;

import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

/**
 * author: yong.li
 * create: 2023-08-10 17:24:21
 **/
class BizNumberGenerator {
    // 编号格式：
    //  前缀 + 16位：PREFIX + YYMMDD + 10位hash值，示例：OD2309122304032440
    //  前缀 + 10位：PREFIX + 10位MURMURHASH值，示例：TF3829356080
    //  10位LONG值：10位MURMURHASH值，示例：4024306400
    //  前缀 + 连接符 + 固定位数随机36进制字符串
    //  前缀 + 固定位数随机36进制字符串
    //  固定位数随机36进制字符串
    
    // 前缀 + 连接符 + 日期 + （RANDOM_LONG｜RANDOM_STR）
    
    private static String longHashSection10Fixed(BizNumberTypeEnum bizType) {
        if (!bizType.isLongHash10Digit()) {
            return "";
        }
        final String uuid = UUID.randomUUID().toString();
        String murmurHashVal = String.valueOf(Hashing.murmur3_32_fixed().hashString(uuid, StandardCharsets.UTF_8).padToLong());
        if (murmurHashVal.length() < 10) {
            murmurHashVal = murmurHashVal.concat("0000000000");
        }
        return murmurHashVal.substring(0, 10);
    }
    
    private static String dateSection(BizNumberTypeEnum bizType) {
        if (!bizType.isContainDate() && bizType.isRandomBase36Str6Digit()) {
            return "";
        }
        
        final String datePattern = "yyMMdd";
        return LocalDate.now().format(DateTimeFormatter.ofPattern(datePattern));
    }
    
    private static String randomBase36Str6Fixed(BizNumberTypeEnum bizType) {
        if (!bizType.isRandomBase36Str6Digit()) {
            return "";
        }
        final String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        return RandomStringUtils.random(6, chars);
    }
    
    /**
     * 
     * 功能描述：生成指定单据类型的单据编号
     *
     * @param bizType
     * @return
     * 
     * @author 刘曙
     *
     * @since 2023年9月22日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public static String next(BizNumberTypeEnum bizType) {
        // 前缀 + 连接符 + 日期 + （RANDOM_LONG｜RANDOM_STR）
        return String.format("%s%s%s%s%s", bizType.getPrefix(), bizType.getSymbol(), dateSection(bizType), longHashSection10Fixed(bizType), randomBase36Str6Fixed(bizType));
    }
    
    /**
     * 
     * 功能描述：生成一个默认编号
     *
     * @return 返回默认10位长度数字类型编号
     * 
     * @author 刘曙
     *
     * @since 2023年9月16日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public static String next() {
        return next(BizNumberTypeEnum.DEFAULT);
    }
    
//    public static void main(String[] args) {
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.ORDER));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.ORDER_REFUND));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.ORDER_PAYMENT_FLOW));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.ORDER_PAYMENT_RECEIPT));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.STUDENT_RECORD_NO));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.RENEWAL));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.TRANSFER));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.DISCOUNT));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.RECEIVABLE_ADJUSTMENT));
//        System.out.println(BizNumberGenerator.next(BizNumberTypeEnum.STUDENT_RECORD_UNIQUE_CODE));
//        System.out.println(BizNumberGenerator.next());
//    }
}
